from logbook import Logger, FileHandler, NestedSetup, NullHandler
import os

# 主应用日志配置
app_log = Logger('App')
module1_log = Logger('App.Module1')
module2_log = Logger('App.Module2')


# 复杂的日志设置
def setup_logging():
    # 主日志文件
    main_handler = FileHandler(
        'app_main.log',
        level='INFO',
        filter=lambda r, h: r.channel.startswith('App') and not r.channel.startswith('App.Module')
    )

    # 模块1专用日志
    module1_handler = FileHandler(
        'app_module1.log',
        level='DEBUG',
        filter=lambda r, h: r.channel == 'App.Module1'
    )

    # 模块2专用日志
    module2_handler = FileHandler(
        'app_module2.log',
        level='DEBUG',
        filter=lambda r, h: r.channel == 'App.Module2'
    )

    # 错误日志（所有模块）
    error_handler = FileHandler(
        'app_errors.log',
        level='ERROR',
        filter=lambda r, h: r.channel.startswith('App')
    )

    return NestedSetup([
        main_handler,
        module1_handler,
        module2_handler,
        error_handler
    ])


# 应用日志设置
log_setup = setup_logging()
log_setup.push_application()

# 模拟应用运行
app_log.info('Application started')


def module1_function():
    module1_log.debug('Module1 debug message')
    module1_log.info('Module1 info message')
    module1_log.error('Module1 error occurred')


def module2_function():
    module2_log.debug('Module2 debug message')
    module2_log.warning('Module2 warning message')
    try:
        1 / 0
    except Exception:
        module2_log.exception('Module2 exception')


module1_function()
module2_function()

app_log.info('Application finished')